/**
 * 文件描述：pinia 文件, 用于快捷页签相关逻辑
 *
 * 逻辑描述:
 * 1. 定义一个 tabs, 用于存储用户添加的快捷页签,数组里面是对象,对象里面有 name, url, icon 属性
 * 2. 定义一个 currentTab, 用于存储当前选中高亮的快捷页签,对象里面有 name, url 属性,当页面刷新时,默认选中第一个数据
 * 3. 定义一个 addTab 方法, 用于添加快捷页签,传入参数 name, url, icon
 * 4. 在 addTab 方法中,判断传进来的参数是否在 tabs 中,如果不存在就把数据添加到 tabs 中
 * 5. 定义一个 setCurrentTab 方法, 用于设置当前高亮的快捷页签,传入参数 name, url
 * 6. 在 setCurrentTab 方法中,把传进来的参数赋值给 currentTab
 */

import { defineStore } from "pinia";
import { ref } from "vue";
import type { MenuItemType } from "@/types/user/index.ts";

export const useTabsStore = defineStore("tabs", () => {
  // 快捷页签数组
  const tabs = ref<MenuItemType[]>([]);

  // 当前高亮的 快捷页签数组
  const currentTab = ref<{ name: string; url: string }>({
    name: "数据看板",
    url: "/dashboard",
  });

  // 添加 快捷页签方法
  const addTab = (name: string, url: string, icon: string) => {
    // 判断传进来的参数是否在 tabs 中
    const isExist = tabs.value.some((tab) => tab.url === url);
    // 如果不存在就把数据添加到 tabs 中
    if (!isExist) {
      tabs.value.push({
        name,
        url,
        icon,
      });
    }
  };

  //设置当前高亮的 快捷页签
  const setCurrentTab = (name: string, url: string) => {
    currentTab.value = { name, url };
  };

  /**
   * 功能作用:删除当前页签
   * 逻辑描述:
   * 从当前高亮的数组中,查到当前页签的索引,这里的 tabs.value 是一个数组,每个元素都是一个对象,对象里面有 name 和 url 属性
   * 判断当前页签的索引是否存在,如果不存在就直接返回
   * 如果存在,就继续判断,判断传入的参数是否是当前高亮的页签
   * 如果是当前高亮的页签,就判断当前页签的索引是否是第一个,如果不是第一个,就继续执行逻辑
   * 首先创建一个变量,用于存储新的页签对象,后面会把新的页签对象重新添加到 当前高亮的 快捷页签数组里 ,这里的 newTab 是一个对象,包含了 name 和 url 属性
   * 继续判断, 判断快捷页签数组里是否还有多个页签,如果有多个页签,就继续执行逻辑
   * 创建一个变量存储并计算新的页签索引,这里的 newIndex 是一个数字,表示新的页签索引,优先前一个，若没有则取后一个
   * 根据新的标签索引,去 快捷页签数组 tabs 里获取到 对应索引 的页签对象,并赋值给 newTab
   * 继续判断,如果有新的页签对象,就把新的页签对象赋值给 当前高亮的快捷页签数组 currentTab
   * 如果当前页签的索引是第一个,就直接返回
   * 这里的 return 是为了防止删除第一个页签,如果删除第一个页签,就直接返回
   * 如果当前页签的索引不是第一个,就继续执行逻辑
   * 最后,过滤删除的页签,先根据传入的参数,在 快捷页签数组 tabs 用 filter 方法 遍历 name(页签名称) 不等于传入的参数 name(页签名称) 的页签,然后把过滤后的结果重新赋值给 tabs
   */
  const removeTab = (name: string) => {
    const currentIndex = tabs.value.findIndex((tab) => tab.name === name);
    if (currentIndex === -1) return;
    if (currentTab.value.name === name) {
      if (currentIndex != 0) {
        let newTab = null;
        if (tabs.value.length > 1) {
          const newIndex =
            currentIndex > 0 ? currentIndex - 1 : currentIndex + 1;
          newTab = tabs.value[newIndex];
        }
        if (newTab) {
          currentTab.value = { name: newTab.name, url: newTab.url };
        }
      } else {
        return;
      }
    }
    tabs.value = tabs.value.filter((tab) => tab.name !== name);
  };

  return { tabs, addTab, currentTab, setCurrentTab, removeTab };
});
